perm filename PRED0.SAI[SYS,HE] blob
sn#016527 filedate 1972-12-06 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00016 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00003 00002 ENTRY DUMMY
00004 00003 α VERIFICATON DISPLAY SUBR
00010 00004 α FAR UNDER FACE
00011 00005 α EHIDE'S MAKE T-JOINT
00014 00006 α ESHOW'S MAKE T-JOINT
00017 00007 α VERTEX V HAS JUST BEEN HIDDEN UNDER FACE F
00018 00008 SUBR EHIDE (ITG F,EDGE,V1)
00021 00009 α CONCAVE CORNER DELAYED EHIDE ARGUMENTS
00022 00010 α TJOYNT VSHOW CASE
00024 00011 α VSHOW - MAKE CONCAVE CORNER VISIBLE
00026 00012 α SHOW AS MUCH OF AN EDGE (WHICH HAPPENS TO BE A FOLD) AS YOU CAN
00028 00013 α FOLD SCAN
00030 00014 BSUBR WITHIN (ITG F,V)
00032 00015 INTERNAL SUBR OCCULT
00034 00016 INTERNAL SUBR KLJOTS
00036 ENDMK
⊗;
ENTRY DUMMY;
BEGIN "OCCULT - A HIDDEN LINE ELIMINATOR - AUGUST 1972"
REQUIRE "PRED0.AUX[SYS,HE]" SOURCE_FILE;
α VERIFICATON DISPLAY SUBR;
INTERNAL STRING SUBR ISTR (ITG Q); ⊂
STRING STR; ITG SERIAL,I;
IF Q=0 THEN RETURN("ZERO");
IF Q=WORLD THEN RETURN("WORLD");
IF Q=CDR(WORLD-4) THEN RETURN("CAMERA");
I ← ITYPE(Q);
SERIAL ← (IF I≠Q THEN CDR(Q) ELSE 0);
IF I=1 THEN STR←NAME[PNAME(Q)] ELSE
STR ← "UBFEV"[(I+1)FOR 1]&CVS(SERIAL);
RETURN(STR); ⊃;
SUBR DPYE (ITG E);
BEGIN "DPYE"
ITG V1,V2;
REAL X1,Y1,X2,Y2;
V1 ← PVT(E); V2 ← NVT(E);
X1 ← XDC(V1); Y1 ← YDC(V1);
X2 ← XDC(V2); Y2 ← YDC(V2);
AIVECT((X1+X2)/2+VERNX,(Y1+Y2)/2+VERNY);
DPYBIG(1);DPYSST(ISTR(E));
DPYBRT(3);AIVECT(X1,Y1);AVECT(X2,Y2);DPYBRT(2);
END "DPYE";
SUBR DPYF (ITG F);
BEGIN "DPYF"
REAL X0,Y0; ITG X1,Y1,X2,Y2; ITG I,E,E0,V,V1,V2;
IF F=BGND THEN ⊂ AIVECT(0,-350);DPYSST("BGND");RETURN;⊃;
X0←Y0←I←0;
E0←E←PED(F);DPYBRT(3);
DO ⊂ V←VCCW(E,F);X0←X0+XDC(V);Y0←Y0+YDC(V);INCREM(I);
V1←PVT(E);V2←NVT(E);
X1←XDC(V1);Y1←YDC(V1);X2←XDC(V2);Y2←YDC(V2);
AIVECT(X1,Y1);AVECT(X2,Y2);
E←ECCW(E,F);
⊃ UNTIL E=E0;DPYBRT(2);
AIVECT(X0/I,Y0/I);DPYBIG(1);DPYSST(ISTR(F));
END "DPYF";
SUBR DPYV(ITG V);
BEGIN "DPYV"
AIVECT(XDC(V)+VERNX,YDC(V)+VERNY);
DPYBIG(1);DPYSST(ISTR(V));
END "DPYV";
α SINGLE-STEP VERIFICATION OUTPUT;
SUBR OSTR(STRING S);
BEGIN "OSTR"
INTEGER CHR,ISTEP,JSTEP,BRK; STRING STR;
INCREM(ISTEP);
OUTSTR(CVS(ISTEP)&"."&9&S&↓);
AIVECT(-200,450);DPYBIG(4);
DPYSST(S);DPYOUT(3);
IF CHR="J"∧(ISTEP<JSTEP) THEN RETURN;
IF 0≤CHR ∧ CHR<'175 THEN
CHR ← INCHRW ELSE CHR←INCHRS;
IF CHR="J" THEN
⊂ STR←INCHWL;JSTEP←INTSCAN(STR,BRK);RETURN;⊃;
END "OSTR";
α VERIFICATION DISPLAY;
PROCEDURE DPYALL;
BEGIN "DPYALL"
LABEL L1,L2;
REAL X1,Y1,X2,Y2;
ITG B,E,V1,V2;
EXTERNAL ITG ARRAY DPYBUF[1:1500];
DPYSET(DPYBUF);
B←WORLD;
L1: B←PBODY(B);IF BTYPE(B) THEN ⊂ E←B;
L2: E←PED(E);IF ETYPE(E) THEN ⊂
IF VISIBLE(E)∨POTENT(E) THEN ⊂
V1←PVT(E);V2←NVT(E);
X1←XDC(V1);Y1←YDC(V1);X2←XDC(V2);Y2←YDC(V2);
AIVECT(X1,Y1);AVECT(X2,Y2);⊃;
GO L2;⊃;
GO L1;⊃;
DPYOUT(2);
END "DPYALL";
α FAR UNDER FACE;
BSUBR FARUF (ITG F,V);
BEGIN "FARUF"
ITG E,E0,NUF,PUF;
α TJOYNT CASE;
IF TJ(V) THEN ⊂
E← (IF TJOT(V) THEN PED(TJOYNT(V)) ELSE PED(V));
NUF←NFACE(E); PUF←PFACE(E);
RETURN( POTENT(NUF) ∨ F≠PUF ); ⊃;
α NON-TJOYNT VERTEX CASE;
E←E0←PED(V);
DO ⊂ IF F=FCCW(E,V) THEN RETURN(FALSE);
E←ECCW(E,V); ⊃ UNTIL E=E0;
RETURN(TRUE);
END "FARUF";
α EHIDE'S MAKE T-JOINT;
SUBR MKTJ1 (ITG FOLD,EDGE,V1);
BEGIN "MKTJ1"
ITG JUT,JOT,EJOT,EJUT,UF;
REAL X,Y; BOOLEAN FLG;
β !;β DPYE(FOLD);β DPYE(EDGE);β DPYV(V1);
β OSTR("MKTJ1("&ISTR(FOLD) COMMA ISTR(EDGE) COMMA ISTR(V1) RPAREN);
α T-JOINT MANDALA
⊗ pvt
|
| EJOT
|
⊗ JOT
JUT |
nvt ⊗______⊗_|__________⊗ V1 pvt
EDGE | EJUT
|
| FOLD
|
⊗ nvt
;
α SPLIT 'EM AND INSURE THAT EJUT IS UNDER;
IF V1≠PVT(EDGE) THEN ⊂ INVERT(EDGE); FLG←TRUE ⊃;
JUT ← ESPLIT(EDGE); TJUT.(JUT); POTEN.(JUT);
POTEN.(EDGE); RINGIN(EDGE,WORLD,#POTNTE);
JOT ← ESPLIT(FOLD); TJOT.(JOT); POTEN.(JOT);
TJOIN.(JUT,JOT); TJOIN.(JOT,JUT);
IF FLG THEN
⊂ INVERT(EDGE); EJUT←PED(JUT);INVERT(EJUT); FLG←FALSE ⊃;
α SOLVE FOR LOCUS;
CROSSING(X,Y,FOLD,EDGE);
DACR(X,JUT+4); DACR(X,JOT+4);
DACR(Y,JUT+5); DACR(Y,JOT+5);
DACR(ZDEPTH(PFACE(EDGE),JUT),JUT+6);
DACR(ZDEPTH(PFACE(FOLD),JOT),JOT+6);
X←32*X/9; Y←32*Y/9; START_CODE MOVE 0,X;MOVE 1,Y;MOVE 2,JUT;
HLLM 0,1(2);HLLM 1,2(2);MOVE 2,JOT;HLLM 0,1(2);HLLM 1,2(2);⊃;
α PRESERVE FOLDED'NESS;
EJOT ← PED(JOT);
FOLD.(EJOT); RINGIN(EJOT,WORLD,#FOLDE);
POTEN.(EJOT); RINGIN(EJOT,WORLD,#POTNTE);
α PRESERVE VISINC'NESS ON FOLD;
IF VISIBLE(PVT(EJOT)) THEN RINGIN(EJOT,WORLD,#VISINC);
IF ¬VISIBLE(NVT(FOLD)) THEN RINGO(FOLD,#VISINC);
END "MKTJ1";
α ESHOW'S MAKE T-JOINT;
FORWARD SUBR EHIDE (ITG F,E,V);
SUBR MKTJ2 (ITG FOLD,EDGE);
BEGIN "MKTJ2"
ITG F,JUT,EJUT,JOT,EJOT;
REAL X,Y;
β !;β DPYE(FOLD);β DPYE(EDGE);
β OSTR("MKTJ2(" & ISTR(FOLD) COMMA ISTR(EDGE) RPAREN);
α SPLIT 'EM;
JUT ← ESPLIT(EDGE);
JOT ← ESPLIT(FOLD);
TJOIN.(JUT,JOT); TJOIN.(JOT,JUT);
α SOLVE FOR LOCUS;
CROSSING(X,Y,FOLD,EDGE);
DACR(X,JUT+4); DACR(X,JOT+4);
DACR(Y,JUT+5); DACR(Y,JOT+5);
DACR(ZDEPTH(PFACE(EDGE),JUT),JUT+6);
DACR(ZDEPTH(PFACE(FOLD),JOT),JOT+6);
X←32*X/9; Y←32*Y/9; START_CODE MOVE 0,X;MOVE 1,Y;MOVE 2,JUT;
HLLM 0,1(2);HLLM 1,2(2);MOVE 2,JOT;HLLM 0,1(2);HLLM 1,2(2);⊃;
α DISTINGUISH OVER AND UNDER;
IF ZPP(JUT)>ZPP(JOT) THEN ⊂ EDGE↔FOLD;JUT↔JOT;⊃;
EJUT ← PED(JUT); POTEN.(EJUT); RINGIN(EJUT,WORLD,#POTNTE);
EJOT ← PED(JOT); POTEN.(EJOT); RINGIN(EJOT,WORLD,#POTNTE);
TJUT.(JUT); POTEN.(JUT);
TJOT.(JOT); POTEN.(JOT);
α PRESERVE FOLDED'NESS;
IF FOLDED(EDGE) THEN
⊂ FOLD.(EJUT); RINGIN(EJUT,WORLD,#FOLDE); ⊃;
FOLD.(EJOT); RINGIN(EJOT,WORLD,#FOLDE);
α PRESERVE VISINC'NESS ON EDGE;
IF FOLDED(EJUT) ∧ VISIBLE(PVT(EJUT))
THEN RINGIN(EJUT,WORLD,#VISINC);
IF FOLDED(EDGE) ∧ ¬VISIBLE(NVT(EDGE))
THEN RINGO(EDGE,#VISINC);
α PRESERVE VISINC'NESS ON FOLD;
IF VISIBLE(PVT(EJOT)) THEN RINGIN(EJOT,WORLD,#VISINC);
IF ¬VISIBLE(NVT(FOLD)) THEN RINGO(FOLD,#VISINC);
α HIDE HALF-EDGE;
F ← PFACE(FOLD);
IF QFEV(F,FOLD,NVT(EDGE))>0
THEN EHIDE(F,EDGE,JUT)
ELSE EHIDE(F,EJUT,JUT);
END "MKTJ2";
α VERTEX V HAS JUST BEEN HIDDEN UNDER FACE F;
FORWARD BSUBR WITHIN(ITG F,V);
SUBR VHIDE (ITG F,V);
BEGIN "VHIDE"
ITG E,U;
LABEL L;
IF ¬POTENT(V)∨¬WITHIN(F,V) THEN RETURN;
β !;β DPYF(F);β DPYV(V);
β OSTR("VHIDE("&ISTR(F) COMMA ISTR(V) RPAREN);
α HIDE JOT WHEN POSSIBLE;
IF TJUT(V) THEN ⊂ U←TJOYNT(V);
IF ZDEPTH(F,U)>ZPP(U) THEN V←U;⊃;
α CLOCK AROUND V'S EDGES;
HIDE.(V);
L: E ← PED(V);
DO ⊂ IF POTENT(E) THEN ⊂ EHIDE(F,E,V);GO L ⊃;
E ← ECCW(E,V); ⊃ UNTIL E=PED(V);
α HIDE JUT WHEN NECESSARY;
IF TJOT(V) THEN ⊂ V←TJOYNT(V); HIDE.(V); GO L ⊃;
END "VHIDE";
SUBR EHIDE (ITG F,EDGE,V1);
BEGIN "EHIDE"
LABEL SOL,L1,L2,EOL;
ITG E,E0,V2,U1,U2,V,FLG;
REAL Q,Q1,Q2;
IF ¬POTENT(EDGE) THEN RETURN;
IF FTYPE(F) THEN E←E0←PED(F) ELSE
⊂ E0←F;F←PFACE(E0);E←ECCW(E0,F);⊃;
β !;β DPYF(F);β DPYE(EDGE);β DPYV(V1);
β OSTR("EHIDE("&ISTR(F) COMMA ISTR(EDGE) COMMA ISTR(V1) RPAREN);
α PICK'EM UP;
FLG ← FALSE;
V2 ← OTHER(EDGE,V1);
V ← (IF TJ(V1) THEN TJOYNT(V1) ELSE 0);
α CLOCK AROUND OVER FACE'S EDGES A'LOOK'N FOR A CROSSING;
SOL: U2 ← VCW(E,F); Q2 ← QEV(EDGE,U2);
L1: U1 ← U2; U2 ← VCCW(E,F);
Q1 ← Q2; Q2 ← QEV(EDGE,U2);
α DOWN FROM A SELF-OVERLAPPING CORNER OR T-JOINT SPECIAL CASE;
IF V1=U1 ∨ V1=U2 THEN GO EOL;
IF TJ(V1) ∧ (U1=V ∨ U2=V) THEN GO EOL;
α UP FROM BELOW SPECIAL CASE;
IF V2=U2 THEN GO L2;
α TEST FOR SIDE OF EXIT CROSSING;
IF Q1⊗Q2<0 ∧ QEV(E,V1)⊗(Q←QEV(E,V2))<0 THEN
BEGIN "FACE EXIT"
F ← OTHER(E,F);
IF ¬POTENT(F) THEN
IF ABS(Q)≥0.01 THEN
⊂ MKTJ1(E,EDGE,V1);β DPYALL; RETURN ⊃ ELSE GO L2;
α EDGE LEAVES F BY CROSSING UNDER A SEAM;
E0 ← E; E ← ECCW(E,F); GO SOL;
END "FACE EXIT";
EOL: E ← ECCW(E,F);
IF E≠E0 THEN GO L1;
α EDGE NEVER LEFT F AND SO IT BE HIDDEN;
FLG ← TRUE;
L2: HIDE.(EDGE);
DEFOLD(EDGE);
β DPYALL;
IF FLG THEN VHIDE(F,V2);
END "EHIDE";
α CONCAVE CORNER DELAYED EHIDE ARGUMENTS;
ITG ARRAY CCARGS[1:20];
SUBR MKVISINC (ITG UUF,EE,VV);
IF FOLDED(EE)∧POTENT(EE) THEN
⊂ UFACE.(UUF,EE,VV);
RINGIN(EE,WORLD,#VISINC);
⊃;
α VSHOW - VERTEX V IS IN VIEW ABOVE FACE UF;
SUBR VSHOW (ITG UF,V);
BEGIN "VSHOW"
ITG F,E,E0;
INTEGER I;
β !;β DPYV(V);β DPYF(UF);
β OSTR("VSHOW("&ISTR(UF) COMMA ISTR(V) RPAREN);
α POTENT FOLDS OF V BECOME VISIBLE INCOMPLETE;
VISIB.(V);
IF ¬TJ(V) THEN
BEGIN "REGULAR"
I←0; E←E0←PED(V);
DO ⊂ INCREM(I); MKVISINC(UF,E,V);
E←ECCW(E,V);⊃ UNTIL E=E0;
IF I≤3 THEN RETURN; α CONVEX CORNERS EXIT HERE;
END "REGULAR";
α TJOYNT VSHOW CASE;
IF TJ(V) THEN
BEGIN "TJ-SHOW"
ITG JUT,JOT,E1,E2,EJUT,NUF,PUF,U;
β OSTR("VSHOW - TJOYNT CASE.");
α PICK 'EM UP;
JUT ← V;
JOT ← TJOYNT(V);
IF TJUT(JOT) THEN JUT↔JOT;
EJUT ← PED(JUT);
α POSSIBLE JUT WIPE OUT BY JOT'S UNDERFACE;
IF (V=JOT)
∧ UF≠PFACE(EJUT)
∧ UF≠NFACE(EJUT)
∧ ZDEPTH(UF,JUT)>ZPP(JUT)
THEN
⊂ VHIDE(UF,JUT);
E1←PED(JOT);
E2←ECCW(E1,JOT);
MKVISINC(UF,E1,JOT);
MKVISINC(UF,E2,JOT);
RETURN;⊃;
α VISINC'IFY EJUT - (SHOTGUN METHOD);
VISIB.(JUT);
E1←PED(JUT);
E2←ECCW(E1,JUT);
MKVISINC(UF,E1,JUT);
MKVISINC(UF,E2,JUT);
α GET EJUT'S FACES & THE FAR UNDER FACE;
PUF←PFACE(E1);
NUF←NFACE(E1);
IF ¬POTENT(NUF) THEN NUF←UF;
α VISINC'IFY EJOTS WITH THEIR PROPER FACES;
VISIB.(JOT);
E1←PED(JOT);
E2←ECCW(E1,JOT);
U ← OTHER(E1,JOT);
IF QFEV(PUF,EJUT,U)>0 THEN E1↔E2;
MKVISINC(NUF,E1,JOT);
MKVISINC(PUF,E2,JOT);
END "TJ-SHOW" ELSE α CONCAVE (NEXT PAGE);
α VSHOW - MAKE CONCAVE CORNER VISIBLE;
α FIND UNDER FACES OF FOLDS AND DO EHIDES WHERE POSSIBLE;
BEGIN "CONCAVE"
ITG I,E,E0,U,S1,S2,F,F0,CUF,CNT;
LABEL L1,L2,EOL;
REAL Z0,Z1,Q1,Q2;
β OSTR("VSHOW - CONCAVE JOINT CASE.");
α FOR ALL THE EDGES OF V;
CNT←0;
E ← E0 ← PED(V);
L1: IF ¬POTENT(E) THEN GO EOL;
U ← OTHER(E,V);
Z0 ← ZPP(U);
α FOR ALL THE FACES OF V NOT BELONGING TO E;
F0 ← FCW(E,V);
F ← FCCW(E,V);
S2 ← ECCW(E,V);
Q2 ← QFEV(F,S2,U);
α GET THE SIDES OF THE FACE WHEN THE FACE IS POTENT;
L2: F ← FCCW(S2,V);
IF F=F0 THEN GO EOL;
S1←S2; S2←ECCW(S2,V);
Q1←-Q2; Q2←QFEV(F,S2,U);
IF ¬POTENT(F) THEN GO L2;
α FACE-EDGE OVERLAP;
IF Q1>0 ∧ Q2>0 THEN
BEGIN
Z1 ← ZDEPTH(F,U);
IF Z1>Z0 THEN ⊂ INCREM(CNT);CCARGS[CNT]←(F LSH 18)+E;GO EOL;⊃;
IF ¬FOLDED(E) THEN GO L2;
CUF ← UFACE(E,V);
IF CUF=UF ∨ Z1>ZDEPTH(CUF,U) THEN UFACE.(F,E,V);
END;
GO L2;
EOL: E←ECCW(E,V);
IF E≠E0 THEN GO L1;
FOR I←1 THRU CNT DO
⊂ F←CCARGS[I] LSH -18; E←CCARGS[I] LAND '777777; EHIDE(F,E,V);⊃;
END "CONCAVE";
END "VSHOW";
α SHOW AS MUCH OF AN EDGE (WHICH HAPPENS TO BE A FOLD) AS YOU CAN;
FORWARD ISUBR FACESCAN (ITG V);
α V1 IS ALREADY VISIBLE, UF IS THE EDGE'S UNDER FACE WRT V1;
SUBR ESHOW (ITG EDGE,V1);
BEGIN "ESHOW"
ITG UF;
REAL X,Y,X0,Y0,Z1,Z2;
ITG V,V2,U1,U2,J1,J2;
ITG FOLD,FOLD0,E,E0,NEAR,E1,E2,EUF;
REAL Q1,Q2,R,RMIN;LABEL L;
β !;β DPYE(EDGE);β DPYV(V1);
β OSTR("ESHOW("&ISTR(EDGE) COMMA ISTR(V1) RPAREN);
α PICK'EM UP;
V2 ← OTHER(EDGE,V1);
UF ← UFACE(EDGE,V1);
IF UF=0 THEN ⊂ UF←FACESCAN(V1);UFACE.(UF,EDGE,V1);⊃;
PED.(EDGE,V1);
J1 ← IF TJ(V1) THEN TJOYNT(V1) ELSE V1;
J2 ← IF TJ(V2) THEN TJOYNT(V2) ELSE V2;
α INIT FOR NEAREST EDGE SCAN;
EUF←NEAR←EDGE;
RMIN←9@9;
X ← XPP(V2);
Y ← YPP(V2);
α CHECK FOR SIDE OF EXIT FROM UNDERFACE;
IF UF=BGND THEN GO L; α GO TO FOLDSCAN;
E ← E0 ← PED(UF);
U2 ← VCW(E,UF);
Q2 ← QEV(EDGE,U2);
DO BEGIN
U1←U2; U2←VCCW(E,UF);
Q1←Q2; Q2←QEV(EDGE,U2);
IF U1≠V1 ∧ U1≠V2 ∧ U1≠J1 ∧ U1≠J2
∧ U2≠V1 ∧ U2≠V2 ∧ U2≠J1 ∧ U2≠J2
∧ Q1⊗Q2<0
∧ QEV(E,V2)⊗QEV(E,V1) < 0
THEN ⊂ EUF←NEAR←E;
CROSSING(X,Y,EDGE,E);
RMIN←QEV(E,V1);
DONE;⊃;
E ← ECCW(E,UF);
END UNTIL E=E0;
α FOLD SCAN;
L: FOLD←FOLD0←WORLD;
WHILE TRUE DO
BEGIN "FOLDSCAN"
FOLD ← CDR(FOLD+#FOLDE);
IF FOLD=FOLD0 THEN DONE;
IF PFACE(FOLD)≠UF
∧ FOLD≠EDGE
∧ (R←QEV(FOLD,V1))<0
∧ AA(FOLD)*X+BB(FOLD)*Y+CC(FOLD) > 0.01
∧ ABS(R)<RMIN
THEN ⊂
U1←PVT(FOLD);
U2←NVT(FOLD);
IF QEV(EDGE,U1)⊗QEV(EDGE,U2)<0
∧ U1≠V1 ∧ U1≠V2 ∧ U1≠J1 ∧ U2≠J2
∧ U2≠V1 ∧ U2≠V2 ∧ U2≠J1 ∧ U2≠J2
THEN ⊂
CROSSING(X0,Y0,FOLD,EDGE);
Z1 ← ZDALT (PFACE(FOLD),X0,Y0);
Z2 ← ZDALT (UF,X0,Y0);
IF Z2>Z1 THEN
ELSE ⊂
NEAR←FOLD;
RMIN←ABS(R);
X←X0;
Y←Y0 ⊃
⊃ ⊃;
END "FOLDSCAN";
α MAKE A T-JOINT WHEN NECESSARY;
IF NEAR≠EDGE THEN
IF RMIN≥0.00 ∨ NEAR=EUF THEN
⊂ MKTJ2(NEAR,EDGE);
EDGE ← PED(V1);
V2 ← OTHER(EDGE,V1); ⊃ ELSE
⊂ EHIDE(NEAR,EDGE,V1);RETURN;⊃;
α MAKE THE EDGE VISIBLE AND PROMULGATE ITS UNDERFACE;
VISIB.(EDGE);
DEFOLD(EDGE);
UFACE.(UF,EDGE,V2);
IF ¬VISIBLE(V2) ∧ FARUF(UF,V2) THEN VSHOW(UF,V2);
END "ESHOW";
BSUBR WITHIN (ITG F,V);
BEGIN "WITHIN"
ITG E,E0;
E ← E0 ← PED(F);
IF V=VCW(E,F) THEN RETURN(FALSE);
DO ⊂
IF V=VCCW(E,F) ∨ QFEV(F,E,V)<0
THEN RETURN(FALSE);
E ← ECCW(E,F);
⊃ UNTIL E=E0;
RETURN(TRUE);
END "WITHIN";
ISUBR FACESCAN (ITG V);
BEGIN "FACESCAN"
REAL Z0,Z1,ZMAX;
ITG F,FMAX,F0,F1,F2;
FMAX ← BGND;
ZMAX ← -9@9;
Z0 ← ZPP(V);
F1 ← F2 ← PFACE(PED(V));
IF TJ(V) THEN F2 ← PFACE(PED(TJOYNT(V)));
F←F0←WORLD;
WHILE TRUE DO
BEGIN "FSCAN"
LABEL L;
F ← CDR(F+#POTNTF);
IF F=F0 THEN DONE;
L: IF F≠F1 ∧ F≠F2 ∧ WITHIN(F,V) THEN
BEGIN
Z1 ← ZDEPTH(F,V);
IF Z1>Z0 THEN RETURN(F);
IF Z1>ZMAX THEN ⊂ ZMAX←Z1; FMAX←F ⊃;
END;
END "FSCAN";
β !;β DPYF(FMAX);β DPYV(V);
β OSTR("FACESCAN RETURNS FMAX = "&ISTR(FMAX));
RETURN(FMAX);
END "FACESCAN";
INTERNAL SUBR OCCULT;
BEGIN "OCCULT"
ITG F,E,V;
REAL SCALEZ;
α CREATE BACKGROUND FACE WHEN NECESSARY;
SCALEZ←41;
DEFINE ZCCMIN=<-100>;
IF BGND=0 THEN ⊂
BGND ← MKBFV;BGND ← PFACE(BGND);
PCNT.(PCNT(WORLD)-1,WORLD); α WORLD PCNT AND POTNTF ARE SAME - SIGH;
DACR(0,BGND-3);
DACR(0,BGND-2);
DACR(1,BGND-1);
DACR(-SCALEZ/(2*ZCCMIN),BGND+4);⊃;
α MAIN SCAN;
WHILE ¬EMPTY(WORLD,#FOLDE) DO
BEGIN
WHILE ¬EMPTY(WORLD,#VISINC) DO
BEGIN
E ← CDR(WORLD+#VISINC);
V ← PVT(E);
IF ¬VISIBLE(V) THEN V←NVT(E);
ESHOW(E,V);
END;
IF ¬EMPTY(WORLD,#FOLDE) THEN
BEGIN
E ← CDR(WORLD+#FOLDE);
V ← PVT(E); IF ¬POTENT(V) THEN V←NVT(E);
F ← FACESCAN(V);
IF ZDEPTH(F,V) > ZPP(V)
THEN VHIDE(F,V)
ELSE VSHOW(F,V);
END;
END;
α PROMOTE REMAINING POTENT EDGES TO VISIBLE;
α ∀ E|EεPOTNTE DO IF POTENT(E) THEN VISIB.(E);
END "OCCULT";
INTERNAL SUBR KLJOTS;
BEGIN "KLJOTS"
ITG B,V,VV;
B ← WORLD;
WHILE WORLD≠(B←PBODY(B)) DO ⊂
V←NVT(B);
WHILE TJ(V) DO ⊂
VV←V; V←NVT(V);
IF TJOT(VV) THEN KLEV(VV);⊃;⊃;
END "KLJOTS";
INTERNAL SUBR KLJUTS;
BEGIN "KLJUTS"
ITG B,V,VV;
B ← WORLD;
WHILE WORLD≠(B←PBODY(B)) DO ⊂
V←NVT(B);
WHILE TJ(V) DO ⊂
VV←V; V←NVT(V);
IF TJUT(VV) THEN KLEV(VV);⊃;⊃;
END "KLJUTS";
INTERNAL SUBR KLTEMP;
BEGIN "KLTEMP"
ITG B,E,V,EE,VV;
B ← WORLD;
WHILE WORLD≠(B←PBODY(B)) DO ⊂
E←NED(B);
WHILE E≠B DO ⊂
EE←E;E←NED(E);IF ('100000 LAND TYPE(EE))≠0 THEN KLFE(EE);⊃;
V←NVT(B);
WHILE V≠B DO ⊂
VV←V;V←NVT(V);IF ('100000 LAND TYPE(VV))≠0 THEN KLEV(VV);⊃;⊃;
END "KLTEMP";
END;